home *** CD-ROM | disk | FTP | other *** search
- /*
- * Copyright 1991, 1992, 1993, 1994, Silicon Graphics, Inc.
- * All Rights Reserved.
- *
- * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, Inc.;
- * the contents of this file may not be disclosed to third parties, copied or
- * duplicated in any form, in whole or in part, without the prior written
- * permission of Silicon Graphics, Inc.
- *
- * RESTRICTED RIGHTS LEGEND:
- * Use, duplication or disclosure by the Government is subject to restrictions
- * as set forth in subdivision (c)(1)(ii) of the Rights in Technical Data
- * and Computer Software clause at DFARS 252.227-7013, and/or in similar or
- * successor clauses in the FAR, DOD or NASA FAR Supplement. Unpublished -
- * rights reserved under the Copyright Laws of the United States.
- */
-
- #include "parse.h"
- #include <gl.h>
- #include <device.h>
- #include <math.h>
- #include <stream.h>
- //#include "gizmo.h"
- #include <osfcn.h>
- #include "showcaseui.h"
- #include <strings.h>
- #include "generic.h"
- #include "cmds.h"
-
- #define BUTTONHEIGHT 16
- #define LINETYPECOUNT 3
-
- extern void showcomment();
- long currentcolor = WHITE;
- extern long showinfo;
- void drawcolorpalette();
- long printall(char *);
- void describeprimitive(primitive *);
- extern void restore255();
- extern void moveworld(long, long);
- extern void zoomworld(float);
-
- struct butblock {
- long xmin, ymin, xmax, ymax;
- char *title;
- long cmd;
- Button *b;
- } vertblock[] = {
- { 10, 5, 0, 100, "New Vert", MOUSEVERT, 0 },
- { 10, 6, 0, 100, "L,L=>V", LLVERT, 0 },
- { 10, 7, 0, 100, "V,V=>Vmid", VVMID, 0 },
- { 10, 8, 0, 100, "V on L", VLCONSTRAIN, 0 },
- { 10, 9, 0, 100, "V on C", VONCIRC, 0 },
- { 10, 10, 0, 100, "L,C=>V", LCV1, 0 },
- { 10, 12, 0, 100, "C,C=>V", CCV1, 0 },
- { 0,0,0,0,0,0,0 }
- };
-
- butblock conicblock[] = {
- { 10, 1, 150, 250, "5*V=>Con", C5V, 0 },
- { 0,0,0,0,0,0,0 }
- };
-
- butblock lineblock[] = {
- { 120, 5, 0, 100, "V,V=>L", VVLINE },
- { 120, 6, 0, 100, "V,L=>Lprp", VLLINEPERP },
- { 120, 7, 0, 100, "V,L=>Lpar", VLLINEPAR },
- { 120, 8, 0, 100, "V,C=>L", VCL1},
- { 120, 10, 0, 100, "C,C=>Lext", CCLE1},
- { 120, 11, 0, 100, "C,C=>Lint", CCLI1},
- { 0,0,0,0,0,0,0 }
- };
-
- butblock layerblock1[] = {
- { 10, 1, 0, 0, "0", L0 },
- { 10, 2, 0, 0, "4", L4 },
- { 10, 3, 0, 0, "8", L8 },
- { 10, 4, 0, 0, "12", L12 },
- { 0,0,0,0,0,0,0 }
- };
-
- butblock layerblock2[] = {
- { 10, 1, 0, 0, "1", L1 },
- { 10, 2, 0, 0, "5", L5 },
- { 10, 3, 0, 0, "9", L9 },
- { 10, 4, 0, 0, "13", L13 },
- { 0,0,0,0,0,0,0 }
- };
-
- butblock layerblock3[] = {
- { 10, 1, 0, 0, "2", L2 },
- { 10, 2, 0, 0, "6", L6 },
- { 10, 3, 0, 0, "10", L10 },
- { 10, 4, 0, 0, "14", L14 },
- { 0,0,0,0,0,0,0 }
- };
-
- butblock layerblock4[] = {
- { 10, 1, 0, 0, "3", L3 },
- { 10, 2, 0, 0, "7", L7 },
- { 10, 3, 0, 0, "11", L11 },
- { 10, 4, 0, 0, "15", L15 },
- { 0,0,0,0,0,0,0 }
- };
-
- butblock layerblock5[] = {
- { 10, 1, 0, 0, "on", LON },
- { 10, 2, 0, 0, "start", LSTART },
- { 10, 3, 0, 0, "next", LNEXT },
- { 10, 4, 0, 0, "prev", LPREV },
- { 0,0,0,0,0,0,0 }
- };
-
- butblock circblock[] = {
- { 10, 16, 0, 100, "Ctr,Edg=>C", MAKECIRC },
- { 10, 17, 0, 100, "V,V,V=>C", VVVC },
- { 0,0,0,0,0,0,0 }
- };
-
- butblock otherblock[] = {
- { 120, 24, 0, 100, "Set Color", COLORCMD },
- { 0,0,0,0,0,0,0 }
- };
-
- void initblock(long xmin, long ymin, butblock *bblk)
- {
- long blockcount = 0;
- while (bblk[blockcount].title) blockcount++;
- for (long i = 0; i < blockcount; i++) {
- bblk[i].b = newtinyradio(xmin+xsize-UIWIDTH, ymin+16*(blockcount-i));
- loadbut(bblk[i].b, bblk[i].title);
- }
- }
-
- long layerset = 0xffffffff;
-
- static void setlayerbuttons()
- {
- drawgeom(); drawgeom();
- for (long i = 0; i < 16; i++) {
- Button *b;
- switch (i & 3) {
- case 0:
- b = layerblock1[i>>2].b;
- break;
- case 1:
- b = layerblock2[i>>2].b;
- break;
- case 2:
- b = layerblock3[i>>2].b;
- break;
- case 3:
- b = layerblock4[i>>2].b;
- break;
- }
- if (layerset & (1<<i))
- activatebut(b);
- else
- deactivatebut(b);
- drawbut(b); swapbuffers(); drawbut(b);
- }
- }
-
- void deleteblockbuttons(butblock *bblk)
- {
- while (bblk->title) { freebut(bblk->b); bblk++; }
- }
-
- void drawblock(butblock *bblk)
- {
- while (bblk->title) {
- drawbut(bblk->b);
- bblk++;
- }
- }
-
- void linkbuts(Button *b, butblock *bblk)
- {
- while (bblk->title) { linkbuttons(b, bblk->b); bblk++; }
- }
-
- void linkradiobuttons()
- {
- Button *b = vertblock[0].b;
- linkbuts(b, vertblock);
- linkbuts(b, lineblock);
- linkbuts(b, circblock);
- linkbuts(b, conicblock);
- linkbuts(b, otherblock);
- }
-
- void turnoffradio()
- {
- Button *b = vertblock[0].b;
- viewport((short)0, (short)(xsize-1), 0, (short)(ysize-PULLDOWNHEIGHT-1));
- ortho2(-0.5, xsize-0.5, -0.5, ysize-PULLDOWNHEIGHT-0.5);
- unpresslinkbuts(b);
- //drawui();
- }
-
- struct labellist {
- long x, y;
- char *s;
- } titles[] = {
- {0, 0, "New Vertex"},
- {0, 0, "New Line"},
- {0, 0, "New Circle"},
- {0, 0, " Other"},
- {0, 0, "Line Type"},
- {0, 0, "Layer Control"},
- {0, 0, "New Conic"},
- {0, 0, 0}
- };
-
- void initlabel(long labelnumber, long xmin, long ymin)
- {
- titles[labelnumber].x = xmin+xsize-UIWIDTH;
- titles[labelnumber].y = ymin;
- }
-
- void drawlabels()
- {
- long i=0;
- while (titles[i].s) {
- drawboldlabel(titles[i].s, titles[i].x, titles[i].y);
- i++;
- }
- }
-
- struct linetypes {
- char *s;
- long cmd;
- Button *b;
- } lt[] = {
- { "Line", MAKELONGLINE },
- { "Ray", MAKERAY },
- { "Segment", MAKESEGMENT }
- };
-
- void initlinetypes(long xmin, long ymin)
- {
- for (long i = 0; i < LINETYPECOUNT; i++) {
- lt[i].b = newradiobut(xmin+xsize-UIWIDTH, ymin + 25*(LINETYPECOUNT-1-i));
- loadbut(lt[i].b, lt[i].s);
- }
- linkbuttons(lt[0].b, lt[1].b);
- linkbuttons(lt[1].b, lt[2].b);
- switch(currentlinetype) {
- case _longline:
- activatebut(lt[0].b); break;
- case _ray12:
- activatebut(lt[1].b); break;
- case _segment:
- activatebut(lt[2].b); break;
- }
- }
-
- void drawlinetypes()
- {
- for (long i = 0; i < LINETYPECOUNT; i++)
- drawbut(lt[i].b);
- }
-
- Button *showinvis, *Showinfo;
- TextBox *tb;
-
- void deleteallbuts()
- {
- deleteblockbuttons(vertblock);
- deleteblockbuttons(lineblock);
- deleteblockbuttons(conicblock);
- deleteblockbuttons(circblock);
- deleteblockbuttons(otherblock);
- deleteblockbuttons(layerblock1);
- deleteblockbuttons(layerblock2);
- deleteblockbuttons(layerblock3);
- deleteblockbuttons(layerblock4);
- deleteblockbuttons(layerblock5);
- for (long i = 0; i < LINETYPECOUNT; i++)
- freebut(lt[i].b);
- freebut(showinvis);
- }
-
- void initinvisible(long xmin, long ymin)
- {
- showinvis = newcheckbut(xmin+xsize-UIWIDTH, ymin);
- loadbut(showinvis, "Show Invis");
- if (showinvisible) activatebut(showinvis);
- Showinfo = newcheckbut(xmin+xsize-UIWIDTH, ymin - 25);
- loadbut(Showinfo, "Show Info");
- if (showinfo) activatebut(Showinfo);
- }
-
- void drawinvisible()
- {
- drawbut(showinvis);
- drawbut(Showinfo);
- }
-
- long Cxmin=10, Cwidth = 23, Cymin = 10, Cheight = 33;
- extern long uiinited;
-
- void initshowcaseui()
- {
- if (uiinited == 0) {
- initui();
- initbut();
- inittb();
- uiinited = 1;
- }
- if (tb == 0)
- tb = newtb(xsize-UIWIDTH+10, xsize-10, 450);
- layerset = 0x1;
- initlabel(0, 20, 388);
- initblock(10, 252, vertblock);
- initlabel(1, 20, 220);
- initblock(10, 101, lineblock);
- initlabel(2, 20, 86);
- initblock(120, 187, conicblock);
- initlabel(6, 130, 226);
- initblock(10, 30, circblock);
- initlabel(3, 20, 30);
- initblock(10, -10, otherblock);
- initblock(10, 470, layerblock1);
- initblock(50, 470, layerblock2);
- initblock(90, 470, layerblock3);
- initblock(130, 470, layerblock4);
- initblock(170, 470, layerblock5);
- initlabel(5, 50, 560);
- initlinetypes(120, 305);
- initlabel(4, 120, 388);
- initinvisible(120, 275);
- linkradiobuttons();
- movetb(tb, xsize-UIWIDTH+10, xsize-10, 450);
- loadtb(tb, "Basic Mode");
- Cxmin = xsize-UIWIDTH+10;
- Cymin = 410;
- }
-
- void drawshowcaseui()
- {
- scrmask((short)(xsize-UIWIDTH), (short)(xsize-1), 0, (short)(ysize-1));
- backgroundclear();
- scrmask(0, (short)(xsize-1), 0, (short)(ysize-1));
- drawblock(vertblock);
- drawblock(lineblock);
- drawblock(conicblock);
- drawblock(circblock);
- drawblock(layerblock1);
- drawblock(layerblock2);
- drawblock(layerblock3);
- drawblock(layerblock4);
- drawblock(layerblock5);
- drawblock(otherblock);
- drawlabels();
- drawlinetypes();
- drawinvisible();
- drawcolorpalette();
- drawtb(tb);
- }
-
- void showmessage(char *s)
- {
- viewport((short)0, (short)(xsize-1), 0, (short)(ysize-PULLDOWNHEIGHT-1));
- ortho2(-0.5, xsize-0.5, -0.5, ysize-PULLDOWNHEIGHT-0.5);
- loadtb(tb, s);
- frontbuffer(1);
- drawtb(tb);
- frontbuffer(0);
- }
-
- long testblock(butblock *bblk, long x, long y)
- {
- while (bblk->title) {
- if (inbut(bblk->b, x, y)) {
- /*if (pressbut(bblk->b, x, y))*/
- activatebut(bblk->b);
- drawbut(bblk->b); swapbuffers(); drawbut(bblk->b);
- return bblk->cmd;
- /*return 0;*/
- }
- bblk++;
- }
- return 0;
- }
-
- long testlinetypes(long x, long y)
- {
- for (long i = 0; i < LINETYPECOUNT; i++) {
- if (selectedpressbut(lt[i].b, x, y, 1))
- return lt[i].cmd;
- }
- return 0;
- }
-
- long testinvisible(long x, long y)
- {
- if (inbut(showinvis, x, y)) {
- if (pressbut(showinvis, x, y))
- return INVIS;
- }
- if (inbut(Showinfo, x, y)) {
- if (pressbut(Showinfo, x, y))
- return INFO;
- }
- return 0;
- }
-
- long testshowcase(long x, long y)
- {
- long result;
- viewport((short)0, (short)(xsize-1), 0, (short)(ysize-PULLDOWNHEIGHT-1));
- ortho2(-0.5, xsize-0.5, -0.5, ysize-PULLDOWNHEIGHT-0.5);
- if (result = testblock(vertblock, x, y)) return result;
- if (result = testblock(circblock, x, y)) return result;
- if (result = testblock(conicblock, x, y)) return result;
- if (result = testblock(otherblock, x, y)) return result;
- if (result = testblock(layerblock1, x, y)) return result;
- if (result = testblock(layerblock2, x, y)) return result;
- if (result = testblock(layerblock3, x, y)) return result;
- if (result = testblock(layerblock4, x, y)) return result;
- if (result = testblock(layerblock5, x, y)) return result;
- return testblock(lineblock, x, y);
- }
-
- void locatem(long x, long y)
- {
- for (long i = 0; i < LINETYPECOUNT; i++)
- locatebut(lt[i].b, x, y);
- locatebut(showinvis, x, y);
- locatebut(Showinfo, x, y);
- }
-
- // User interface state:
-
- enum uistate {
- SELECTSTATE, VV1STATE, VV2STATE, LL1STATE, LL2STATE,
- VL1STATE, LPERP1STATE, LPERP2STATE,
- LPAR1STATE, LPAR2STATE, CREATEVERTEXSTATE,
- C1STATE, C2STATE, VVMID1STATE, VVMID2STATE,
- VONCIRC1STATE, LCV11, LCV12,
- VCL11, VCL12, LCCEXT11, LCCEXT12,
- LCCINT11, LCCINT12, VCC11, VCC12, CVVV1,
- CVVV2, CVVV3, SETCOLORS,
- C5V1, C5V2, C5V3, C5V4, C5V5,
- } UIstate;
-
- long sticky = 0;
- extern long vnumber;
-
- void setselect()
- {
- if (UIstate != SELECTSTATE) {
- turnoffradio();
- drawui();
- UIstate = SELECTSTATE;
- }
- }
-
- void drawcolorpalette()
- {
- for (long i = 0; i < 9; i++) {
- if (i < 7)
- color((short)(i+1));
- else
- color(8);
- rectfi(Cxmin + i*Cwidth, Cymin,
- Cxmin + (i+1)*Cwidth, Cymin + Cheight);
- color(BLACK);
- recti(Cxmin + i*Cwidth, Cymin,
- Cxmin + (i+1)*Cwidth, Cymin + Cheight);
- }
- drawlabel("In", 7*Cwidth+Cxmin+6, Cymin+15);
- drawlabel("Sm", 8*Cwidth+Cxmin+2, Cymin+15);
- }
-
- long incolor(long x, long y)
- {
- long col;
-
- if (x < Cxmin || x > Cxmin+9*Cwidth ||
- y < Cymin || y > Cymin+Cheight) return 0;
- col = (x-Cxmin)/Cwidth+1;
- if (col == 8) col = C_1;
- if (col == 9) col = C_2;
- return col;
- }
-
- void clearbuffer()
- {
- vnumber = 1;
- cleartable(idtable);
- clearplist();
- setselect();
- drawmode(PUPDRAW); color(0); clear(); drawmode(NORMALDRAW);
- }
-
- void displaymessage(char *s)
- {
- message(s, "Confirm", 0, 0);
- #ifdef NOTDEF
- long w = winget();
- prefposition(100, 700, 100, 200);
- long w1 = winopen("message");
- color(WHITE);
- clear();
- color(BLACK);
- cmov2i(20, 50);
- charstr(s);
- cmov2i(30, 20);
- charstr("Press <ESC> to continue");
- while (getbutton(ESCKEY)==0) sginap(1);
- winclose(w1);
- winset(w);
- #endif
- }
-
- void drawui()
- {
- viewport((short)0, (short)(xsize-1), 0, (short)(ysize-PULLDOWNHEIGHT-1));
- ortho2(-0.5, xsize-0.5, -0.5, ysize-PULLDOWNHEIGHT-0.5);
- drawgeom();
- drawshowcaseui();
- swapbuffers();
- drawshowcaseui();
- }
-
- void checklinetype()
- {
- if (pselected && pselected->ptype == _line) {
- line *l = (line *)pselected;
- l->type = currentlinetype;
- // XXX setlinetype(l, currentlinetype);
- }
- }
-
- void editgeomtext()
- {
- FILE *fp = 0;
- printall("/tmp/geom.x");
- do {
- if (fp) fclose(fp);
- system("jot -f /tmp/geom.x");
- fp = fopen("/tmp/geom.x", "r");
- cleartable(idtable);
- clearplist();
- } while (0 == parsefile(fp));
- fclose(fp);
- }
-
- char dir[200];
-
- long interpbutton(long x, long y)
- {
- long command;
-
- command = testshowcase(x, y);
- if (command == 0) command = testlinetypes(x, y);
- if (command == 0) command = testinvisible(x, y);
- drawui();
- long c;
- if (c = incolor(x, y)) {
- setselect();
- if (c == C_1 || c == C_2) return c;
- return C0 + c;
- }
- return command;
- }
-
- void setmessage()
- {
- char *msg = 0;
- static char *omsg = 0;
-
- switch (UIstate) {
- case SELECTSTATE:
- msg = "Basic Mode"; break;
- case VV1STATE:
- case CVVV1:
- case C5V1:
- case VVMID1STATE:
- msg = "Pick Vertex 1"; break;
- case VV2STATE:
- case CVVV2:
- case C5V2:
- case VVMID2STATE:
- msg = "Pick Vertex 2"; break;
- case LL1STATE:
- msg = "Pick Line 1"; break;
- case LL2STATE:
- msg = "Pick Line 2"; break;
- case VL1STATE:
- msg = "New Vertex on Line"; break;
- case LPERP1STATE:
- case LPAR1STATE:
- case VCL11:
- msg = "Pick Vertex"; break;
- case LPERP2STATE:
- msg = "Pick Perpendicular Line"; break;
- case LPAR2STATE:
- msg = "Pick Parallel Line"; break;
- case CREATEVERTEXSTATE:
- msg = "Make New Vertex"; break;
- case C1STATE:
- msg = "Circle Center Vertex"; break;
- case C2STATE:
- msg = "Circle Edge Vertex"; break;
- case VONCIRC1STATE:
- msg = "New Vertex on Circle"; break;
- case LCV11:
- msg = "Pick Line"; break;
- case VCL12:
- case LCV12:
- msg = "Pick Circle"; break;
- case VCC11:
- case LCCEXT11:
- case LCCINT11:
- msg = "Pick Circle 1"; break;
- case VCC12:
- case LCCEXT12:
- case LCCINT12:
- msg = "Pick Circle 2"; break;
- case CVVV3:
- case C5V3:
- msg = "Pick Vertex 3"; break;
- case C5V4:
- msg = "Pick Vertex 4"; break;
- case C5V5:
- msg = "Pick Vertex 5"; break;
- case SETCOLORS:
- msg = "Pick Item to Color"; break;
- }
- if (omsg != msg) {
- showmessage(msg);
- omsg = msg;
- }
- }
-
- void dispatchcmd(long, long);
- long cookedqread(long *);
- void handleredraw();
- void handlegeombutton(long x, long y);
- extern long EPS;
-
- /* mainloop() is the main loop of the program that collects commands
- * and dispatches to the correct routines. In this application, commands
- * come from the pull-down menu only.
- */
-
- void mainloop()
- {
- long cmd = -1;
- long val, dev, x, y, xx, xpos, ypos, ly;
- short junkval;
-
- handleredraw();
- setlayerbuttons();
- UIstate = SELECTSTATE;
- while (1) {
- dev = cookedqread(&val);
- setmessage();
- if (dev == LEFTMOUSE || dev == MIDDLEMOUSE) {
- if (val == 1 && dev == LEFTMOUSE)
- cmd = pulldownevent(getvaluator(MOUSEX)-xorg, getvaluator(MOUSEY)-yorg);
- if (cmd != -1) {dev = cmd; val = 0; cmd = -1; }
- else {
- if (val == 0) continue;
- x = getvaluator(MOUSEX);
- y = getvaluator(MOUSEY);
- if (x - xorg > xsize-UIWIDTH) {
- if (xx = interpbutton(x-xorg, y-yorg)) {
- sticky = (dev == MIDDLEMOUSE) ? 1 : 0;
- } else
- sticky = 0;
- dev = xx;
- if (dev == 0) setselect();
- }
- }
- if (dev == LEFTMOUSE || dev == RIGHTMOUSE) {
- handlegeombutton(x, y);
- drawgeom();
- continue;
- }
- }
- if (dev == MOUSEX || dev == MOUSEY) {
- while (qtest() == MOUSEX || qtest() == MOUSEY) dev = qread(&junkval);
- xpos = getvaluator(MOUSEX)-xorg;
- ypos = getvaluator(MOUSEY)-yorg;
- if (xpos > xsize-UIWIDTH && xpos < xsize &&
- ypos > 0 && ypos < ysize) {
- locatem(xpos, ypos);
- }
- continue;
- }
- switch (dev) {
- case MAKELONGLINE:
- currentlinetype = _longline;
- checklinetype();
- break;
- case MAKESEGMENT:
- currentlinetype = _segment;
- checklinetype();
- break;
- case MAKERAY:
- currentlinetype = _ray12;
- checklinetype();
- break;
- case MOUSEVERT:
- UIstate = CREATEVERTEXSTATE;
- break;
- case VVLINE:
- UIstate = VV1STATE;
- break;
- case LLVERT:
- UIstate = LL1STATE;
- break;
- case VLLINEPERP:
- UIstate = LPERP1STATE;
- break;
- case VLLINEPAR:
- UIstate = LPAR1STATE;
- break;
- case VLCONSTRAIN:
- UIstate = VL1STATE;
- break;
- case MAKECIRC:
- UIstate = C1STATE;
- break;
- case VVMID:
- UIstate = VVMID1STATE;
- break;
- case VONCIRC:
- UIstate = VONCIRC1STATE;
- break;
- case INVIS:
- showinvisible = 1 - showinvisible;
- break;
- case INFO:
- showinfo = 1 - showinfo;
- break;
- case LCV1:
- UIstate = LCV11;
- break;
- case VCL1:
- UIstate = VCL11;
- break;
- case CCLE1:
- UIstate = LCCEXT11;
- break;
- case CCLI1:
- UIstate = LCCINT11;
- break;
- case CCV1:
- UIstate = VCC11;
- break;
- case VVVC:
- UIstate = CVVV1;
- break;
- case C5V:
- UIstate = C5V1;
- break;
- case COLORCMD:
- UIstate = SETCOLORS;
- break;
- case COMCMD:
- showcomment();
- break;
- case LON:
- layerset = 0xffffffff;
- setlayerbuttons();
- deactivatebut(layerblock5[0].b);
- drawbut(layerblock5[0].b); swapbuffers(); drawbut(layerblock5[0].b);
- break;
- case LPREV:
- layerset >>= 1;
- setlayerbuttons();
- deactivatebut(layerblock5[3].b);
- drawbut(layerblock5[3].b); swapbuffers(); drawbut(layerblock5[3].b);
- break;
- case LNEXT:
- layerset <<= 1;
- setlayerbuttons();
- deactivatebut(layerblock5[2].b);
- drawbut(layerblock5[2].b); swapbuffers(); drawbut(layerblock5[2].b);
- break;
- case LSTART:
- layerset = 0x1;
- setlayerbuttons();
- deactivatebut(layerblock5[1].b);
- drawbut(layerblock5[1].b); swapbuffers(); drawbut(layerblock5[1].b);
- break;
- case L0: case L1: case L2: case L3: case L4: case L5:
- case L6: case L7: case L8: case L9: case L10: case L11:
- case L12: case L13: case L14: case L15:
- ly = dev - L0;
- layerset ^= (1<<ly);
- setlayerbuttons();
- break;
- case C_1: case C_2: case C_3:
- case C0: case C1: case C2: case C3:
- case C4: case C5: case C6: case C7:
- currentcolor = (short)(dev - C0);
- if (pselected) {
- setdirtyfile();
- pselected->Color = currentcolor;
- }
- break;
- case QUITDAMMIT: // quit, dammit!
- dirtyfile_flag = 0;
- handlequitcmd();
- break;
- case NEWCMD:
- setselect();
- handlenewcmd();
- break;
- case OPENCMD:
- setselect();
- handleopencmd();
- break;
- case SAVECMD:
- setselect();
- handlesavecmd();
- break;
- case SAVEASCMD:
- setselect();
- handlesaveascmd();
- break;
- case INSERTCMD:
- setselect();
- handleinsertcmd();
- break;
- case PRINTCMD:
- EPS = 0;
- handleprintcmd();
- setselect();
- break;
- case PRINTEPS:
- EPS = 1;
- handleprintcmd();
- setselect();
- break;
- case QUITCMD:
- setselect();
- handlequitcmd();
- break;
- case HELPCMD:
- setselect();
- handlehelpcmd();
- break;
- case LEFTARROWKEY:
- if (val == 0) break;
- moveworld(-1, 0);
- break;
- case RIGHTARROWKEY:
- if (val == 0) break;
- moveworld(1, 0);
- break;
- case UPARROWKEY:
- if (val == 0) break;
- moveworld(0, 1);
- break;
- case DOWNARROWKEY:
- if (val == 0) break;
- moveworld(0, -1);
- break;
- case PAGEUPKEY:
- if (val == 0) break;
- zoomworld(1.01);
- break;
- case PAGEDOWNKEY:
- if (val == 0) break;
- zoomworld(1.0/1.01);
- break;
- case EDITGEOM:
- editgeomtext();
- sticky = 0;
- setselect();
- break;
- case DELSELECTION:
- if (pselected)
- deleteprimitive(pselected);
- break;
- case DESCRIBESELN:
- if (pselected)
- describeprimitive(pselected);
- break;
- case WINQUIT:
- case WINSHUT:
- handlequitcmd();
- break;
- case REDRAW:
- handleredraw();
- break;
- case 0:
- break;
- default:
- break;
- }
- drawgeom();
- }
- }
-
- void handlegeombutton(long x, long y)
- {
- float fx, fy;
- static vertex *v1, *v2, *v3, *v4, *v5;
- static line *l1, *l2;
- static circle *c1, *c2;
- primitive *p;
-
- getpoint(&fx, &fy, x, y);
- switch (UIstate) {
- case SELECTSTATE:
- selectvertex(fx, fy);
- break;
- case CREATEVERTEXSTATE:
- v1 = makevertex(fx, fy);
- v1->c.type = VERTFREE;
- if (!sticky) setselect();
- addprimitive(v1);
- break;
- case VV1STATE:
- v1 = hitvertex(fx, fy);
- if (v1)
- UIstate = VV2STATE;
- break;
- case VV2STATE:
- v2 = hitvertex(fx, fy);
- if (v2) {
- if (sticky) UIstate = VV1STATE; else setselect();
- addprimitive(linevertvert(v1, v2));
- }
- break;
- case C1STATE:
- v1 = hitvertex(fx, fy);
- if (v1)
- UIstate = C2STATE;
- break;
- case C2STATE:
- v2 = hitvertex(fx, fy);
- if (v2) {
- if (sticky) UIstate = C1STATE; else setselect();
- addprimitive(circvertvert(v1, v2));
- }
- break;
- case VVMID1STATE:
- v1 = hitvertex(fx, fy);
- if (v1)
- UIstate = VVMID2STATE;
- break;
- case VVMID2STATE:
- v2 = hitvertex(fx, fy);
- if (v2) {
- if (sticky) UIstate = VVMID1STATE; else setselect();
- addprimitive(vertvertvertmid(v1, v2));
- }
- break;
- case LL1STATE:
- l1 = hitline(fx, fy);
- if (l1)
- UIstate = LL2STATE;
- break;
- case LL2STATE:
- l2 = hitanotherline(fx, fy, l1);
- if (l2) {
- if (sticky) UIstate = LL1STATE; else setselect();
- addprimitive(vertlineline(l1, l2));
- }
- break;
- case VL1STATE:
- l1 = hitline(fx, fy);
- if (l1) {
- vertex *v1 = new vertex;
- genname(v1);
- v1->xw = fx; v1->yw = fy; v1->w = 1.0;
- pselected = v1;
- v1->c.type = VERTFREE;
- if (sticky) UIstate = VL1STATE; else setselect();
- addprimitive(v1);
- verttoline(v1, l1);
- }
- break;
- case VONCIRC1STATE:
- c1 = hitcircle(fx, fy);
- if (c1) {
- vertex *v1 = new vertex;
- genname(v1);
- v1->xw = fx; v1->yw = fy; v1->w = 1.0;
- pselected = v1;
- v1->c.type = VERTFREE;
- if (sticky) UIstate = VONCIRC1STATE; else setselect();
- addprimitive(v1);
- verttocirc(v1, c1);
- }
- break;
- case LCV11:
- l1 = hitline(fx, fy);
- if (l1)
- UIstate = LCV12;
- break;
- case LCV12:
- c1 = hitcircle(fx, fy);
- if (c1) {
- if (sticky) UIstate = LCV11; else setselect();
- addprimitive(linecirctovert1(l1, c1, fx, fy));
- }
- break;
- case VCL11:
- v1 = hitvertex(fx, fy);
- if (v1)
- UIstate = VCL12;
- break;
- case VCL12:
- c1 = hitcircle(fx, fy);
- if (c1) {
- if (sticky) UIstate = VCL11; else setselect();
- addprimitive(vertcirctoline1(v1, c1, fx, fy));
- }
- break;
- case LPERP1STATE:
- v1 = hitvertex(fx, fy);
- if (v1)
- UIstate = LPERP2STATE;
- break;
- case LPERP2STATE:
- l1 = hitline(fx, fy);
- if (l1) {
- if (sticky) UIstate = LPERP1STATE; else setselect();
- addprimitive(linevertlineperp(v1, l1));
- }
- break;
- case LPAR1STATE:
- v1 = hitvertex(fx, fy);
- if (v1)
- UIstate = LPAR2STATE;
- break;
- case LPAR2STATE:
- l1 = hitline(fx, fy);
- if (l1) {
- if (sticky) UIstate = LPAR1STATE; else setselect();
- addprimitive(linevertlinepar(v1, l1));
- }
- break;
- case LCCEXT11:
- c1 = hitcircle(fx, fy);
- if (c1)
- UIstate = LCCEXT12;
- break;
- case LCCEXT12:
- c2 = hitanothercircle(fx, fy, c1);
- if (c2) {
- if (sticky) UIstate = LCCEXT11; else setselect();
- addprimitive(circcirctolineext1(c1, c2, fx, fy));
- }
- break;
- case LCCINT11:
- c1 = hitcircle(fx, fy);
- if (c1)
- UIstate = LCCINT12;
- break;
- case LCCINT12:
- c2 = hitanothercircle(fx, fy, c1);
- if (c2) {
- if (sticky) UIstate = LCCINT11; else setselect();
- addprimitive(circcirctolineint1(c1, c2, fx, fy));
- }
- break;
- case VCC11:
- c1 = hitcircle(fx, fy);
- if (c1)
- UIstate = VCC12;
- break;
- case VCC12:
- c2 = hitanothercircle(fx, fy, c1);
- if (c2) {
- if (sticky) UIstate = VCC11; else setselect();
- addprimitive(circcirctovert1(c1, c2, fx, fy));
- }
- break;
- case CVVV1:
- v1 = hitvertex(fx, fy);
- if (v1)
- UIstate = CVVV2;
- break;
- case CVVV2:
- v2 = hitvertex(fx, fy);
- if (v2)
- UIstate = CVVV3;
- break;
- case CVVV3:
- v3 = hitvertex(fx, fy);
- if (v3) {
- if (sticky) UIstate = CVVV1; else setselect();
- addprimitive(vvvtocircle(v1, v2, v3));
- }
- break;
- case C5V1:
- v1 = hitvertex(fx, fy);
- if (v1)
- UIstate = C5V2;
- break;
- case C5V2:
- v2 = hitvertex(fx, fy);
- if (v2 && (v2 != v1))
- UIstate = C5V3;
- break;
- case C5V3:
- v3 = hitvertex(fx, fy);
- if (v3 && (v3 != v2) && (v3 != v1))
- UIstate = C5V4;
- break;
- case C5V4:
- v4 = hitvertex(fx, fy);
- if (v4 && (v4 != v3) && (v4 != v2) && (v4 != v1))
- UIstate = C5V5;
- break;
- case C5V5:
- v5 = hitvertex(fx, fy);
- if (v5 && (v5 != v4) && (v5 != v3) && (v5 != v2) && (v5 != v1)) {
- if (sticky) UIstate = C5V1; else setselect();
- addprimitive(vvvvvtoconic(v1, v2, v3, v4, v5));
- }
- break;
- case SETCOLORS:
- p = hitprimitive(fx, fy);
- if (p) {
- if (sticky == 0) setselect();
- p->Color = currentcolor;
- }
- break;
- }
- unlocateall();
- }
-